package com.tjh.gulimall.ssoserver.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;

/**
 * day102：单点登录 -->sso认证服务器端
 * 测试（需开启GulimallTestSsoServerApplication、GulimallTestSsoClientApplication、GulimallTestSsoClient2Application服务）：
 *      1、若用户未登录则跳转登录页，此处模拟登录故可以随意填写用户名、密码进行登录，不做校验
 *      2、登录成功跳回之前的页面，并携带token信息，在cookie中保留用户登录痕迹
 *      3、浏览器新增访问：http://ssoserver.com:8080
 *      4、在浏览器中 --》f12 --》Application --》 Cookies 中找到name为sso_token的cookie 说明成功的把用户登录痕迹保存下来
 *
 * 核心：
 *      1、给登录服务器留下登录痕迹
 *      2、登录服务器要将token信息重定向的时候，带到url地址上
 *      3、其他系统要处理url地址上的关键token，只要有，将token对应的用户保存到自己的session中
 *      4、自己系统将用户保存在自己的会话中
 * Create by koala on 2021-05-15
 */
@Controller
public class LoginController {

    @Autowired
    StringRedisTemplate redisTemplate;

    //获取登录的用户信息
    @ResponseBody
    @GetMapping("userInfo")
    public String userInfo(@RequestParam("token") String token) {
        String s = redisTemplate.opsForValue().get(token);
        return s;
    }

    //跳转登录页
    @GetMapping("/login.html")
    public String loginPage(@RequestParam("redirect_url") String url, Model model,
                            @CookieValue(value = "sso_token", required = false) String sso_token){
        if(!StringUtils.isEmpty(sso_token)){
            //说明之前有人登录过，浏览器留下了痕迹
            return "redirect:" + url + "?token=" + sso_token;
        }

        model.addAttribute("url", url);
        return "login";
    }

    //用户登录
    @PostMapping("doLogin")
    public String doLogin(@RequestParam("username") String username,
                          @RequestParam("password") String password,
                          @RequestParam("url") String url,
                          HttpServletResponse response){
        if(!StringUtils.isEmpty(username) && !StringUtils.isEmpty(password)){
            //登录成功，跳回之前页面
            //把登录成功的用户存起来
            String uuid = UUID.randomUUID().toString().replace("-","");
            redisTemplate.opsForValue().set(uuid, username);
            Cookie sso_token = new Cookie("sso_token", uuid);
            response.addCookie(sso_token);
            return "redirect:" + url + "?token=" + uuid;
        }
        //登录失败，展示登录页
        return "login";
    }
}
